<?php

/**
 *  smarty function:url生成（Mobile対応版）
 */
function smarty_function_url_ex($params, &$smarty)
{
    //print_r($params);
    $c =& Ethna_Controller::getInstance();
    $url_handler =& $c->getUrlHandler();
    $url = $url_handler->getUrlFor($params);
    return $url;
}

/*
function smarty_function_link_to($params, &$smarty)
{
    $c =& Ethna_Controller::getInstance();
    $url_handler =& $c->getUrlHandler();
    
    if (isset($params['html_option'])) {
        $html_option = $params['html_option'];
        unset($params['html_option']);
    } else {
        $html_option = null;
    }
    
    $url = $url_handler->url_for($params);
    $str = '';
    
    return $str;
}
*/

/**
 *  smarty block:フォームタグ出力プラグイン（Mobile対応版）
 */
function smarty_block_form_ex($params, $content, &$smarty, &$repeat)
{
    if ($repeat) {
        // {form}: ブロック内部に進む前の処理
        
        // default
        if (isset($params['default']) === false) {
            // 指定なしのときは $form を使う
            $c =& Ethna_Controller::getInstance();
            $af =& $c->getActionForm();
            
            // c.f. http://smarty.php.net/manual/en/plugins.block.functions.php
            $smarty->_tag_stack[count($smarty->_tag_stack)-1][1]['default']
                =& $af->getArray(false);
        }
        
        // ここで返す値は出力されない
        return '';
        
    } else {
        // {/form}: ブロック全体を出力
        
        $c =& Ethna_Controller::getInstance();
        $view =& $c->getView();
        if ($view === null) {
            return null;
        }
        
        // ethna_action
        $hidden_action = '';
        if (isset($params['ethna_action'])) {
            $ethna_action = $params['ethna_action'];
            unset($params['ethna_action']);
            
            $view->addActionFormHelper($ethna_action);
            $hidden_action = $c->getActionRequest($ethna_action, 'hidden');
        }
        
        // Session用のHiddenタグを出力（Mobileのみ）
        $hidden_session = '';
        $without_session = false;
        if (isset($params['without_session'])) {
            $without_session = $params['without_session'];
            unset($params['without_session']);
        }
        if (!$without_session) {
            $hidden_session = $c->getSessionHiddenTag();
        }
  
        // 未ログインかつモバイルの場合、
        // サイトに最初にアクセスしたアクション・直前のアクション・リスティングパラメータをhiddenタグに出力
        $first_action  = ''; 
        $pre_action    = '';
        $listing_param = '';
        $acc = new Smscom_AccessControll($c->getBackend());
        if (!$acc->isLogin() && Mobile_Util::isMobile()) {
            if (!empty($_REQUEST['f_action'])) {
              $first_action = sprintf('<input type="hidden" name="f_action" value="%s" />', htmlspecialchars($_REQUEST['f_action'], ENT_QUOTES));
            }
            if (!empty($_REQUEST['p_action'])) {
              $pre_action = sprintf('<input type="hidden" name="p_action" value="%s" />', htmlspecialchars($_REQUEST['p_action'], ENT_QUOTES));
            }
            if (!empty($_REQUEST['act'])) {
                $listing_param = sprintf('<input type="hidden" name="act" value="%s" />', htmlspecialchars($_REQUEST['act'], ENT_QUOTES));
            }
        }

        $content = $hidden_action . $hidden_session . $content . $listing_param . $first_action . $pre_action;
        
        // enctype の略称対応
        if (isset($params['enctype'])) {
            if ($params['enctype'] == 'file'
                || $params['enctype'] == 'multipart') {
                $params['enctype'] = 'multipart/form-data';
            } else if ($params['enctype'] == 'url') {
                $params['enctype'] = 'application/x-www-form-urlencoded';
            }
        }
        
        // defaultはもう不要
        if (isset($params['default'])) {
            unset($params['default']);
        }
        
        // $contentを囲む<form>ブロック全体を出力
        return $view->getFormBlock($content, $params);
    }
}

/**
 *  smarty function:フォームタグ生成（Mobile対応版）
 *
 *  @param  string  $name   フォーム項目名
 */
function smarty_function_form_input_ex($params, &$smarty)
{
    // name
    if (isset($params['name'])) {
        $name = $params['name'];
        unset($params['name']);
    } else {
        return null;
    }

    // view object
    $c =& Ethna_Controller::getInstance();
    $view =& $c->getView();
    if ($view === null) {
        return null;
    }

    // 現在の{form_input}を囲むform blockがあればパラメータを取得しておく
    $block_params = null;
    for ($i = count($smarty->_tag_stack); $i >= 0; --$i) {
        if ($smarty->_tag_stack[$i][0] === 'form') {
            $block_params = $smarty->_tag_stack[$i][1];
            break;
        }
    }

    // action
    $action = null;
    if (isset($params['action'])) {
        $action = $params['action'];
        unset($params['action']);
    } else if (isset($block_params['ethna_action'])) {
        $action = $block_params['ethna_action'];
    }
    if ($action !== null) {
        $view->addActionFormHelper($action);
    }
    
    // istyle
    if (isset($params['istyle'])) {
        $mode = $params['istyle'];
        unset($params['istyle']);
        
        $istyle_attr = Mobile_Util::getIStyle($mode, false);
        $params = array_merge($params, $istyle_attr);
    }
    

    // default
    if (isset($params['default'])) {
        // {form_input default=...}が指定されていればそのまま

    } else if (isset($block_params['default'])) {
        // 外側の {form default=...} ブロック
        if (isset($block_params['default'][$name])) {
            $params['default'] = $block_params['default'][$name];
        }
    }

    // 現在のアクションで受け取ったフォーム値
    $af =& $c->getActionForm();
    $val = $af->get($name);
    if ($val !== null) {
        $params['default'] = $val;
    }

    return $view->getFormInput($name, $action, $params);
}

/**
 *  smarty function:モバイル入力補助出力
 *
 *  @param  integer  $mode   1:
 */
function smarty_function_istyle($params, &$smarty)
{
    // mode
    if (isset($params['mode'])) {
        $mode = $params['mode'];
        unset($params['mode']);
    } else {
        return null;
    }
    
    $istyle_attr = Mobile_Util::getIStyle($mode, true);
    $attr = array();
    foreach ($istyle_attr as $key => $value) {
        if ($value === null) {
            $attr[] = sprintf('%s', $key);
        } else {
            $attr[] = sprintf('%s="%s"', $key, $value);
        }
    }
    
    return implode(' ', $attr);
}

/**
 *  smarty function:フォーム値表示
 *
 *  @param  string  $name   フォーム項目名
 */
function smarty_function_form_value($params, &$smarty)
{
    // name
    if (isset($params['name'])) {
        $name = $params['name'];
        unset($params['name']);
    } else {
        return null;
    }
    
    // view object
    $c =& Ethna_Controller::getInstance();
    $view =& $c->getView();
    if ($view === null) {
        return null;
    }
    
    // action
    $action = null;
    if (isset($params['action'])) {
        $action = $params['action'];
        unset($params['action']);
    } else {
        /* // formタグ内で値が参照できなくなる不具合が発生するのでコメントアウト modified by sangu 2009.02.06
        for ($i = count($smarty->_tag_stack); $i >= 0; --$i) {
            if ($smarty->_tag_stack[$i][0] === 'form') {
                if (isset($smarty->_tag_stack[$i][1]['ethna_action'])) {
                    $action = $smarty->_tag_stack[$i][1]['ethna_action'];
                }
                break;
            }
        }
        */
    }
    if ($action !== null) {
        $view->addActionFormHelper($action);
    }
    
    $value = $view->getFormValue($name, $action, $params);
    
    return htmlspecialchars($value, ENT_QUOTES);
}

/**
 *  smarty modifier:画像のサムネイル表示
 *
 */
function smarty_modifier_thumb($strVal, $width=0, $height=0, $opt=null)
{
    $c =& Ethna_Controller::getInstance();
    $phpThumbPath = $c->getConfig()->get('phpthumb_path');
   
    $str = sprintf("%s?src=%s&w=%d&h=%d", $phpThumbPath, urlencode($strVal), $width, $height);
    
    if(!is_null($opt)) $str .= '&' . $opt;
    
    // ブラウザキャッシュを抑制するために現在のタイムスタンプを付加
    $str .= '&tac=' . mktime();
    
    return $str;
}

/**
 * smarty modifier:内部絵文字コードをimgタグに変換
 *
 */
function smarty_modifier_emoji2img($strVal)
{
    // PCの場合だけ内部絵文字コードをimgタグに変換する
    if (!Mobile_Util::isMobile()) {
        $ctl =& Ethna_Controller::getInstance();
        $strVal = $ctl->mobile_util->emoji_outputFilter($strVal);
    }
    
    return $strVal;
}

/**
 * smarty modifier:内部絵文字コードを削除
 *
 */
function smarty_modifier_emoji_strip($strVal)
{
    // 内部絵文字コードを全て削除
    $strVal = Mobile_Util::emoji_strip($strVal);
    
    return $strVal;
}

/**
 * 
 *
 */
function smarty_function_is_new_term($params, &$smarty)
{


}

/**
 * smarty modifier:Aタグの外部リンクを踏み台のURLに変換する
 *
 */
function smarty_modifier_convert_external_link($strVal)
{
    $c =& Ethna_Controller::getInstance();
    $url_handler =& $c->getUrlHandler();
    $strVal = $url_handler->convertExternalLink($strVal);
    
    return $strVal;
}

// [ALL] モバイルの投稿フォーム内でサイト内URLを指定する際に付加するセッションタグを定義する(2009.04.24 by kurosawa)
/**
 * smarty modifier:Aタグの内部リンクにあるタグをセッションに置換する
 *
 */
function smarty_modifier_replace_session_tag($strVal)
{
    $c =& Ethna_Controller::getInstance();
    $url_handler =& $c->getUrlHandler();
    $strVal = $url_handler->replaceSessionTag($strVal);
    
    return $strVal;
}

// {{{ smarty_function_message2 
// messageタグを仕様した場合クラス名のみ表示するように修正。
/**
 *  smarty function:指定されたフォーム項目に対応するエラーメッセージを出力する
 *
 *  sample:
 *  <code>
 *  <input type="text" name="foo">{message name="foo"}
 *  </code>
 *  <code>
 *  <input type="text" name="foo">fooを入力してください
 *  </code>
 *
 *  @param  string  $name   フォーム項目名
 */
function smarty_function_message2($params, &$smarty)
{
    if (isset($params['name']) === false) {
        return '';
    }

    $c =& Ethna_Controller::getInstance();
    $action_error =& $c->getActionError();

    $option = '';
    $option.= isset($params['class']) ? ' class="' . $params['class'] . '"' : ' class="error"';
//    if (isset($params['id'])) $option .= ' id="' . $params['id'] . '"';
    $tag_str = '<span%s>%s</span><br />';

    $error  = '';
    $errors = $action_error->getErrorList();
    foreach ($errors as $e) {
        if (strcasecmp($e['name'], $params['name']) == 0) {
            $error .= sprintf($tag_str, $option, $action_error->_getMessage($e));
        }
    }
    return $error;
}
// }}}

?>
